import router from "./router/router";
import { resetRouter } from "@/router/router.js";
import store from "./store/store";
import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style
import storage from "@/utils/storage"; // 从 cookie 中获取令牌

const whiteList = ["/login"]; // 白名单

// 全局路由前置守卫
router.beforeEach(async (to, from, next) => {
	// 开始进度条
	NProgress.start();
	// 如果用户要去一个空的路由，直接重定向到主页
	if (to.path == "/") {
		next({ name: "Home" });
	}
	const hasToken = storage('token').get();
	// 判断是否有 token，如果设置过 token 则代表登录成功
	if (hasToken) {
		// 如果已经登录，用户再次去首页，则重定向到主页
		if (whiteList.indexOf(to.path) !== -1) {
			next({ name: "Home" });
		} else {
			const hasRoles = store.getters.roles && store.getters.roles.length > 0;
			// 判断用户是否通过 getInfo 获取了自己的权限角色
			if (hasRoles) {
				next();
			} else {
				// 如果没有获取过用户信息则获取一下
				// 注意：角色必须是对象数组！如: ['admin'] or ,['developer','editor']
				const { roles } = await store.dispatch("user/getInfo");
				// 根据角色生成可访问的路线图
				const accessRoutes = await store.dispatch("sidebar/generateRoutes", roles);
				resetRouter(); // 在添加路由前重置一下路由，防止出现路由重复的问题
				// 动态添加可访问路由
				for (let x of accessRoutes) {
					router.addRoute(x);
				}
				// hack 方法来确保 addRoutes 是完整的
				// 设置 replace：true 所以导航不会留下历史记录
				next({ ...to, replace: true });
			}
		}
	} else {

		if (whiteList.indexOf(to.path) !== -1) {
			next(); // 在白名单中，直接 next
		} else {
			next({ name: "Login" }); // 其他无权访问的页面被重定向到登录页面
		}
	}
});

router.afterEach((to, from) => {
	const exclude = ["Login"];
	if (!exclude.includes(to.name)) {
		// 路由跳转时添加 tag
		store.commit("tags/addTag", {
			key: to.name,
			value: to.meta.title || to.name,
		});
	}
	// 完成进度条
	NProgress.done();
});
